/**
 * @fileoverview 数组扁平化处理：多维数组转一维数组
 */

// 示例
let data = [1, [2, [3, [4, 5]]], 6]
let dataFlat = []

// 第1种
// array的api：flat()

// dataFlat = data.flat(Infinity)

// 第2种
// array的api：toString()、map()
// 适用于数组内全部是数字的情况

// dataFlat = data.toString().split(',').map( item => +item )

/**
 * 第3种
 * 递归
 *
 * @param {array} arr 多维数组
 */
/* function flatten(arr) {
  let item = null
  for (let i = 0; i < arr.length; i++) {
    item = arr[i]
    if (Array.isArray(item)) {
      flatten(item)
    } else {
      arr.push(item)
    }
  }
}

flatten(data) */

/**
 * 第4种
 * 扩展运算符
 *
 * @param {array} 多维数组
 * @return {array} 一维数组
 */
/* function flatten(arr) {
  while (arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr)
  }
  return arr
}

dataFlat = flatten(data) */

/**
 * 第5种
 * 使用reduce方法
 *
 * @return {array}
 */
/* Array.prototype.flatten = function () {
  return this.reduce(function (prev, cur, curIndex, arr) {
    return Array.isArray(cur) ? prev.concat(cur.flatten()) : prev.concat(cur)
  }, [])
}

dataFlat = data.flatten() */

/**
 * 第6种
 * yield*的用法，天才级别的扁平化处理方式
 *
 * @param {*} arr 多维数组
 */
function* flatten(arr) {
  if (Array.isArray(arr)) {
    for (let i = 0; i < arr.length; i++) {
      yield* flatten(arr[i])
    }
  } else {
    yield arr
  }
}

data = [1, 2, ['a', 'b', ['中', '文', [1, 2, 3, [11, 21, 31]]]], 3]

for (const x of flatten(data)) {
  dataFlat.push(x)
}

console.log(dataFlat)
